package br.com.datasun.biblioteca.ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import java.awt.Font;
import images.ImageLoader;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import javax.swing.JComboBox;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;

import javax.swing.JTextField;
import javax.swing.table.DefaultTableColumnModel;

import br.com.datasun.biblioteca.entities.Categoria;
import br.com.datasun.biblioteca.entities.Assunto;
import br.com.datasun.biblioteca.ui.components.CategoriaTableModel;
import br.com.datasun.biblioteca.ui.listeners.KeyListenerTamanhoCampo;
import br.com.datasun.biblioteca.ui.controller.ICRUDController;
import br.com.datasun.biblioteca.ui.listeners.KeyListenerTamanhoCampo;
import br.com.datasun.biblioteca.ui.controller.CadastroCategoriaController;

public class CadastroCategoriaUI extends JPanel {
	private JPanel jpNorte = new JPanel();
	private JPanel jpTabela = new JPanel();
	private JPanel jpBotoes = new JPanel();
	private JPanel jpDados = new JPanel();
	
	private JButton jbLimpar = new JButton();
	private JButton jbNovo = new JButton();
	private JButton jbFechar = new JButton();
	private JButton jbSalvar = new JButton();
	private JButton jbExcluir = new JButton();
	
	private JLabel jlTituloCadastro = new JLabel("Cadastro de Categorias");
	private final JLabel jlAssunto = new JLabel("Assunto");
	private final JComboBox jcAssunto = new JComboBox();
	private final JLabel jlNome = new JLabel("Nome");
	private final JTextField jtNome = new JTextField();
	
	private JScrollPane jscrollPane = new JScrollPane();
	private JTable tabelaCategoria = new JTable();
	private CategoriaTableModel categoriaTableModel;
	
	private int indiceCategoriaEmEdicao = -1;
	private Categoria categoriaEmEdicao;
	private Categoria categoriaSelecionado;
	
	private boolean isEditing = false; //Determina se o registro est� em edi��o
	public boolean isEditing(){
		return this.isEditing;
	}
	
	private ICRUDController controller;
	
	
	public void setIsEditing(boolean isEditing){
		this.isEditing = isEditing;
	}
	
	private List<Assunto> assuntos;
	
	/**
	 * Create the panel.
	 */
	public CadastroCategoriaUI() {
		jtNome.setColumns(10);
		setLayout(new BorderLayout(0,0));
		jpNorte.setPreferredSize(new Dimension(621,200));
		add(jpNorte,BorderLayout.NORTH);
		jpNorte.setLayout(new BorderLayout(0,0));
				
		jlTituloCadastro.setFont(new Font("Tahoma", Font.BOLD, 11));
		jlTituloCadastro.setHorizontalAlignment(SwingConstants.CENTER);
		jpNorte.add(jlTituloCadastro, BorderLayout.NORTH);
		
		jpBotoes.setPreferredSize(new Dimension(621,35));
		jpNorte.add(jpBotoes,BorderLayout.SOUTH);
		
		Dimension tamanhoBotoes = new Dimension(115,25);
		jbLimpar.setPreferredSize(tamanhoBotoes);
		jbNovo.setPreferredSize(tamanhoBotoes);
		jbFechar.setPreferredSize(tamanhoBotoes);
		jbSalvar.setPreferredSize(tamanhoBotoes);
		jbExcluir.setPreferredSize(tamanhoBotoes);
		jbLimpar.setIcon(ImageLoader.createImageIcon("btnLimpar115x25.png"));
		jbNovo.setIcon(ImageLoader.createImageIcon("btnNovo115x25.png"));
		jbFechar.setIcon(ImageLoader.createImageIcon("btnFechar115x25.png"));
		jbSalvar.setIcon(ImageLoader.createImageIcon("btnSalvar115x25.png"));
		jbExcluir.setIcon(ImageLoader.createImageIcon("btnExcluir115x25.png"));
		
		jpBotoes.add(jbLimpar);
		jpBotoes.add(jbNovo);
		jpBotoes.add(jbFechar);
		jpBotoes.add(jbExcluir);
		jpBotoes.add(jbSalvar);
			
		
		
		jpNorte.add(jpDados,BorderLayout.CENTER);
		add(jpTabela,BorderLayout.CENTER);
		GridBagLayout gbl_jpDados = new GridBagLayout();
		gbl_jpDados.columnWidths = new int[]{146, 343, 140, 0};
		gbl_jpDados.rowHeights = new int[]{81, 0, 0};
		gbl_jpDados.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE};
		gbl_jpDados.rowWeights = new double[]{0.0, 0.0, Double.MIN_VALUE};
		jpDados.setLayout(gbl_jpDados);
		
		GridBagConstraints gbc_jlAssunto = new GridBagConstraints();
		gbc_jlAssunto.insets = new Insets(0, 0, 5, 5);
		gbc_jlAssunto.anchor = GridBagConstraints.SOUTHEAST;
		gbc_jlAssunto.gridx = 0;
		gbc_jlAssunto.gridy = 0;
		jlAssunto.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpDados.add(jlAssunto, gbc_jlAssunto);
		
		GridBagConstraints gbc_jcAssunto = new GridBagConstraints();
		gbc_jcAssunto.fill = GridBagConstraints.HORIZONTAL;
		gbc_jcAssunto.insets = new Insets(0, 0, 5, 5);
		gbc_jcAssunto.anchor = GridBagConstraints.SOUTH;
		gbc_jcAssunto.gridx = 1;
		gbc_jcAssunto.gridy = 0;
		jpDados.add(jcAssunto, gbc_jcAssunto);
		
		GridBagConstraints gbc_jlNome = new GridBagConstraints();
		gbc_jlNome.anchor = GridBagConstraints.EAST;
		gbc_jlNome.insets = new Insets(0, 0, 0, 5);
		gbc_jlNome.gridx = 0;
		gbc_jlNome.gridy = 1;
		jlNome.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpDados.add(jlNome, gbc_jlNome);
		
		GridBagConstraints gbc_jtNome = new GridBagConstraints();
		gbc_jtNome.insets = new Insets(0, 0, 0, 5);
		gbc_jtNome.fill = GridBagConstraints.HORIZONTAL;
		gbc_jtNome.gridx = 1;
		gbc_jtNome.gridy = 1;
		jpDados.add(jtNome, gbc_jtNome);
		
		jscrollPane.setViewportView(tabelaCategoria);
		jpTabela.setLayout(new BorderLayout(20,20));
		jpTabela.add(jscrollPane);
		
		tabelaCategoria.setColumnModel(new DefaultTableColumnModel());
		//permite selecionar apenas uma linha
		tabelaCategoria.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
	    categoriaTableModel = new CategoriaTableModel();
		tabelaCategoria.setModel(categoriaTableModel);
		
		setTamanhoMaximoCampos();
		limparFormulario();
		editarCampos(false);
		
		
		
		controller = new CadastroCategoriaController(this);
	    controller.carregarDados();
		inicializaListeners();
		
		

	}
	
	public void inicializaListeners(){
		jbLimpar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				controller.btnLimparEventHandler();
			}
		});
		
		jbNovo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				controller.btnNovoEventHandler();				
			}
		});
		
		jbFechar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {				
				controller.btnFecharEventHandler();
			}
		});
		
		jbSalvar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				controller.btnSalvarEventHandler();
			}
		});
		
		jbExcluir.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				controller.excluirEventHandler();
			}
		});
		
		//trata o evento de duplo click para edi��o
		tabelaCategoria.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				controller.selecionarParaEdicaoEventHandler(arg0);
			}
		});
		tabelaCategoria.addKeyListener(new KeyAdapter() {
			public void keyTyped(KeyEvent arg0) {
				char tecla = arg0.getKeyChar();
				if(tecla == KeyEvent.VK_DELETE){
					int linhaSelecionada = tabelaCategoria.getSelectedRow();
					if(linhaSelecionada > -1){
						categoriaTableModel.remover(linhaSelecionada);
					}else{
						JOptionPane.showMessageDialog(CadastroCategoriaUI.this, "Por favor selecione um registro para excluir!", "Sele��o de registro requerida!", JOptionPane.WARNING_MESSAGE);
					}
				}
			}
		});	
		
        jcAssunto.addItemListener(new ItemListener() {
			
			@Override
			public void itemStateChanged(ItemEvent arg0) {
				Assunto assuntoSelecionado = new Assunto();
				assuntoSelecionado = (Assunto) arg0.getItem();
								
			}
		});
		
	}
	
	public void limparFormulario(){
		jtNome.setText("");
		jcAssunto.setSelectedIndex(-1);
	}
	
	public void editarCampos(boolean editar){
		jtNome.setEnabled(editar);	
		jcAssunto.setEnabled(editar);
		
		jbLimpar.setEnabled(editar);
		jbNovo.setEnabled(!editar);
		jbFechar.setEnabled(!editar);
		jbExcluir.setEnabled(editar);
		jbSalvar.setEnabled(editar);
					
		if (!editar){
			jtNome.setBackground(null);	
			jcAssunto.setBackground(null);
		}
		
		tabelaCategoria.setEnabled(!editar);
		
	}
	
		
	public void carregarFormularioAPartirDe(Categoria categoriaAExibir){		
		if(categoriaAExibir!= null){
			Assunto assunto;			
			jtNome.setText(categoriaAExibir.getNome());	
			
			assunto = categoriaAExibir.getAssunto();
			if (assunto != null){
				jcAssunto.setSelectedItem(assunto);
			}
		}
	}
	
	public void setCategoriaEmEdicao(Categoria categoriaEmEdicao) {
		this.categoriaEmEdicao = categoriaEmEdicao;
	}
		
	public void requestFocusCampoNomeCategoria(){
		jtNome.requestFocus();
	}
	
	public void requestFocusCampoAssunto(){
		jcAssunto.requestFocus();
	}
	
	public void setCategoriaSelecionado(Categoria categoriaSelecionado) {
		this.categoriaSelecionado = categoriaSelecionado;
	}

	
	private void setTamanhoMaximoCampos(){
		jtNome.addKeyListener(new KeyListenerTamanhoCampo(jtNome, 255));		
	}
	
	private boolean validarCamposObrigatorios(){
		boolean result = true;
		Color corCamposObrigatorios = new Color(255, 255, 204);		
		
		if ("".equals(jtNome.getText().trim())){
			result = false;
			jtNome.setBackground(corCamposObrigatorios);
		}
		
		if (jcAssunto.getSelectedIndex() == -1){
			result = false;
			jcAssunto.setBackground(corCamposObrigatorios);
		}
		
		if (!result) {
	    	JOptionPane.showMessageDialog(CadastroCategoriaUI.this, "Por favor informe os campos Obrigat�rios!", "Campos obrigat�rios requeridos!", JOptionPane.WARNING_MESSAGE);
	    }else{
	    	jtNome.setBackground(null);
	    	jcAssunto.setBackground(null);
	    }
		  
		return result;
	}

	public void setIndiceCategoriaEmEdicao(int indiceCategoriaEmEdicao) {
		this.indiceCategoriaEmEdicao = indiceCategoriaEmEdicao;
	}
	

	public int getIndiceCategoriaSelecionado() {
		return tabelaCategoria.getSelectedRow();
	}

	public Categoria getCategoria(int linhaSelecionada){
		return this.categoriaTableModel.getCategoriaDe(linhaSelecionada);
	}	
	
	public int getIndiceCategoriaEmEdicao() {
		return indiceCategoriaEmEdicao;
	}
	
	private Categoria copiarCategoria(Categoria categoria){
		Categoria result = null;
		if(categoria!= null){
			result = new Categoria();
			result.setId(categoria.getId());
			result.setNome(categoria.getNome());
			Assunto assunto;
			assunto = categoria.getAssunto();
			if (assunto != null){
				result.setAssunto(assunto);
			}
		}
		return result;
	}
	
	public void inicializarAssuntos(){
		for (Assunto assunto : assuntos) {
			jcAssunto.addItem(assunto);
		}
		Assunto assuntoSelecionado = new Assunto();
		assuntoSelecionado = (Assunto) jcAssunto.getSelectedItem();
	}
	
	public void setAssuntos(List<Assunto> assuntos) {
		this.assuntos = assuntos;
	}
	
	public List<Assunto> getAssuntos() {
		return assuntos;
	}
	
	public void setCategorias(List<Categoria> categorias){
		this.categoriaTableModel.setCategorias(categorias);
	}
	
	public Assunto getAssuntoSelecionado(){
		Assunto resultado = null;
		if (jcAssunto.getSelectedIndex() != -1){
			resultado = (Assunto) jcAssunto.getSelectedItem();
		}
		return resultado;
	}
	
	public Categoria getCategoriaEmEdicao() {
		return categoriaEmEdicao;
	}

	public Categoria getCategoriaSelecionado() {
		return categoriaEmEdicao;
	}
	
	
	public String getNomeCategoria() {
		return jtNome.getText();
	}
	
	public void setNomeCategoria(String nome) {
		jtNome.setText(nome);
	}
	
	public void inserirCategoria (Categoria categoria) {
		this.categoriaTableModel.inserir(categoria);
	}
	
	public void atualizarCategoria(Categoria categoria, int indiceCategoriaSelecionado){
		this.categoriaTableModel.atualizarCategoria(categoria,indiceCategoriaSelecionado);
	}	
	
	public void removerCategoria(Categoria categoria){
		this.categoriaTableModel.remover(categoria);
	}
}
